package com.ming.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.ming.dao.TbFunctionMapper;
import com.ming.jsonVO.Menu;
import com.ming.jsonVO.OneMenu;
import com.ming.jsonVO.PerRolesVO;
import com.ming.jsonVO.TwoMenu;
import com.ming.service.TbFunctionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * @author MING
 * @date 2018/9/7 16:41
 */
@Service
public class TbFunctionServiceImpl implements TbFunctionService {
    @Autowired
    private TbFunctionMapper tbFunctionMapper;

    @Override
    public Set<String> getFunction(Set<String> role) {
        return tbFunctionMapper.getFunction(role);
    }

    @Override
    public String getFunction_URL() {
//        Collection<String> role = customRealm.getRoles();
        Collection<String> role = new HashSet<>();
        role.add("超级管理员");
        List<PerRolesVO> perRolesVOList = tbFunctionMapper.getFunction_URL((Set<String>) role);

//        最后需要返回的json数据
        List<OneMenu> oneMenuList = new ArrayList<>();
//        定义 i 做第一次的判断
        int i = 0;
        s :for (PerRolesVO perRolesVO : perRolesVOList) {
            //        一级菜单
            OneMenu oneMenu = new OneMenu();
//            封装二级菜单判断时使用
            String one = "";
//            第一次循环的时候添加一级菜单的 title
            if (i == 0){
                oneMenu.setTitle(perRolesVO.getTfFuncName());
                one = oneMenu.getTitle();
                i = 2;
            }else{
//                运行到这里的时候，这里肯定是 perRolesVOList 第二次循环，
//                那么 oneMenuList  肯定也是有数据的，通过第一次添加的一级菜单title进行判断，防止二次添加
                for (OneMenu oneMenu1 : oneMenuList){
//                    一级菜单名相同的只能有一个
                    if (!oneMenu1.getTitle().equals(perRolesVO.getTfFuncName())){
                        oneMenu.setTitle(perRolesVO.getTfFuncName());
                        one = oneMenu.getTitle();
                    }else {
//                        结束本次 perRolesVOList 循环，进行下次循环
//                        一级菜单名相同，在后面的逻辑中一级菜单是已经封装完毕
                        continue s;
                    }
                }
            }

            List list = new ArrayList();
            for (PerRolesVO perRolesVO2 : perRolesVOList) {
//                这次添加的一级菜单名，与次循环中一级菜单名进行比较，相同则添加做二级菜单封装
                if (one.equals(perRolesVO2.getTfFuncName())){
//                    创建二级菜单
                    TwoMenu twoMenu = new TwoMenu();
                    twoMenu.setTitle(perRolesVO2.getTfnFuncName());
                    twoMenu.setHref(perRolesVO2.getTfnFuncURL());
                    list.add(twoMenu);
//                    如果二级菜单为空，就清空这个list
                    if (perRolesVO2.getTfnFuncName() == null){
                        list.clear();
                    }
                }
            }
//            防止二级菜单为空
            if (list.size() != 0){
                oneMenu.setChildren(list);
            }
            oneMenuList.add(oneMenu);
        }
        Menu menu = new Menu();
        menu.setContentManagement(oneMenuList);
        String jsonString = JSONObject.toJSONString(menu);
        return jsonString;
    }
}
